beforeEach(to, from, next)
:
to
: 即將進入的路由對象。from
: 即將離開的路由對象。next
: 函數,用於確定是否進行下一步的導航,可以傳入一個路徑進行手動導航。目的:想讓已認證用戶導向其他頁面
// router/index.js
const routes = [
{
path: '/public',
component: PublicComponent
},
{
path: '/private',
component: PrivateComponent,
meta: {
requiresAuth: true
}
}
];
router.beforeEach((to, from, next) => {
console.log("beforeEach to", to) // 可以先console.log出對象
console.log("beforeEach from", from)
if (to.meta.requiresAuth && !isAuthenticated()) {
// 如果路由需要身份驗證且用戶未驗證,可以將用戶導向登錄頁面
next('/login');
} else {
// 否則,可以繼續導航
next();
}
});
to.meta.requiresAuth
是否為 true
以及用戶是否已經驗證。在使用者已經登入的情況下
每次跳頁的時候都調用一次authstatechange
router.beforeEach(async (to, from, next) => {
console.log("beforeEach to", to)
console.log("beforeEach from", from)
// 使用者未登入
if (!indexUserInfo.uid) {
try {
const result = await authStateChanged()
if (result.uid) {
if (from.fullPath === to.fullPath && to.name !== "Home") {
// 使用者已登入且從 LoginPage 到 HomePage,則使用 next({ name: "Home" }) 將路由導向到名稱為 "Home" 的路由。
next({ name: "HomePage" })
} else if (from.fullPath !== to.fullPath && to.name !== "Login") {
// 使用者未登入,則使用 next({ name: "Login" }) 將路由導向到名稱為 "Login" 的路由。
next({ name: "LoginPage" })
} else {
next() // 繼續原本的導航
}
} else {
next() // 繼續原本的導航
}
} catch (error) {
console.error("Error during authentication check:", error)
next({ name: "LoginPage" }) // 錯誤時導航到 LoginPage
}
} else {
// 如果使用者已登入,繼續導航
next()
}
})
1.Vue Router-Dynamic Route動態路由